﻿#define _CRT_SECURE_NO_WARNINGS 1

//模拟实现atoi

#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>

//enum State
//{
//	VAILD,
//	INVAILD
//}Sta = INVAILD;
//
//int my_atoi(const char* str)
//{
//	assert(str);
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	while (isspace(*str))
//	{
//		str++;
//	}
//	int flag = 1;
//	if (*str == '+')
//	{
//		flag = 1;
//		str++;
//	}
//	else if (*str == '-')
//	{
//		flag = -1;
//		str++;
//	}
//	long long ret = 0;
//	while (*str != '\0')
//	{
//		if (isdigit(*str))
//		{
//			ret = ret * 10 + flag * (*str - '0');
//			if (ret > INT_MAX) 
//			{
//				return INT_MAX;
//			}
//			if (ret < INT_MIN)
//			{
//				return INT_MIN;
//			}
//		}
//		else
//		{
//			return (int)ret;
//		}
//		str++;
//	}
//
//	if (*str == '\0')
//	{
//		Sta = VAILD;
//	}
//	return (int)ret;
//}
//
//int main()
//{
//	char arr[20] = "-123 4as bfaf";
//	int ret = my_atoi(arr);
//	if (Sta == VAILD)
//	{
//		printf("合法转换: %d\n", ret);
//	}
//	else if (Sta == INVAILD)
//	{
//		printf("非法转换: %d\n", ret);
//	}
//	return 0;
//}

//int main()
//{
//	int* ptr = NULL;
//	ptr = (int*)malloc(sizeof(int) * 10);
//	if (ptr != NULL)
//	{
//		for (int i = 0; i < 10; i++)
//		{
//			*(ptr + 1) = 0;
//		}
//	}
//	free(ptr);
//	ptr = NULL;
//	return 0;
//}

//int main()
//{
//	int* p = calloc(10, sizeof(int));
//	if (p != NULL)
//	{
//		for (int i = 0; i < 10; i++)
//		{
//			printf("%d ", *(p + i));
//		}
//	}
//	free(p);
//	p = NULL;
//	return 0;
//}

//int main()
//{
//	int* ptr = (int*)malloc(100);
//	if (ptr != NULL)
//	{
//		//业务处理
//	}
//	else 
//	{
//		return 1;
//	}
//
//	//扩充容量
//
//	//代码1 - 直接将realloc的返回值放到ptr中
//	ptr = (int*)realloc(ptr, 100);//(可以吗? , 如果开辟内存失败又会如何?)
//
//	//代码2 - 先将realloc函数的返回值放在p中, 不为NULL,再放在ptr中
//
//	int* p = NULL;
//	p = realloc(ptr, 1000);
//	if (p != NULL)
//	{
//		ptr = p;
//	}
//	//业务处理
//
//	free(ptr);
//	free(p);
//	ptr = NULL;
//	p = NULL;
//	return 0;
//}

//struct _iobuf {
//	char* _ptr;
//	int _cnt;
//	char* _base;
//	int _flag;
//	int _file;
//	int _charbuf;
//	int _bufsiz;
//	char* _tmpfname;
//};
//typedef struct _iobuf FILE;

/* fopen fclose example */
//#include <stdio.h>
//int main()
//{
//	FILE* pFile;
//	//打开⽂件 
//	pFile = fopen("myfile.txt", "w");
//	//⽂件操作 
//	if (pFile != NULL)
//	{
//		fputs("fopen example", pFile);
//		//关闭⽂件 
//		fclose(pFile);
//	}
//	return 0;
//}

/* fseek example */
#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "wb");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

/* ftell example : getting size of a file */
#include <stdio.h>
int main()
{
	FILE* pFile;
	long size;
	pFile = fopen("myfile.txt", "rb");
	if (pFile == NULL)
		perror("Error opening file");
	else
	{
		fseek(pFile, 0, SEEK_END); // non-portable
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of myfile.txt: %ld bytes.\n", size);
	}
	return 0;
}


#include <stdio.h>
int main()
{
	int n;
	FILE* pFile;
	char buffer[27];

	pFile = fopen("myfile.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pFile);
	rewind(pFile);

	fread(buffer, 1, 26, pFile);
	fclose(pFile);

	buffer[26] = '\0';
	printf(buffer);
	return 0;
}

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int c; // 注意：int，⾮char，要求处理EOF 
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 当读取失败的时候或者遇到⽂件结束的时候，都会返回EOF 
	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环 
	{
		putchar(c);
	}
	//判断是什么原因结束的 
	if (ferror(fp))
		puts("I/O error when reading");
	else if (feof(fp))
		puts("End of file reached successfully");

	fclose(fp);
}

#include <stdio.h>

enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式 
	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组 
	fclose(fp);

	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组 
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n)
			printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}

	fclose(fp);
}
